/*
 * PRAID.c
 *
 *  Created on: 21/10/2011
 *      Author: MadeyMaga
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "nipc.h"
#include "raid.h"
#include "Disco.h"
#include "config.h"
#include "busqueda.h"
#include "pedidos.h"

extern int 		totalSectors, discoid;
//extern t_log 	*s_log;

void atenderRaid(int fdSock)
{
	int 			aux;
	nipcMessage 	msg;

	aux = nipc_recv(&msg, fdSock);

	if(aux == NIPC_ERROR_NONE)
	{
		switch(msg.type)
		{
			case GET_SEC: //lectura
				aux = getSector(fdSock, &msg);
				break;
			case PUT_SEC: //escritura
				aux = putSector(fdSock, &msg);
				break;
			case OTRACOSA:
				break;
			default:
				break;
		}
	}
	else
	{
		printf("Se perdio la conexion con el raid.\n");
		exit(0);
	}
}

/* Devuelve si ok:fdSock, sino: -1 */
int crearSockRaid()
{
	int 			fdSock, retval, errno = 0;
	char 			raidip[16];
	unsigned short 	raidport;
	nipcMessage		msg;

	msg.payload = (char *) malloc(15);
	memset(msg.payload, 0, 15);

	getConfig("raidip", raidip);
	getConfig("raidport", &raidport);

	if(-1 == (fdSock = sockets_open_client(raidip, raidport)))
	{
		perror("socket raid");
		printf("Error al abrir el socket para conectar con el raid. Error n°: %d, descripcion: %s.\n", errno, strerror(errno));
		exit(1);
	}

	sprintf(msg.payload, "%d;%d;", discoid, totalSectors);

	msg.payloadLength = strlen(msg.payload)+1;

	memset(msg.payloadID, '\0', 6);
	sprintf(msg.payloadID, "%d", fdSock);

	msg.type = '0';

	nipc_send(&msg, fdSock);

	retval = nipc_recv(&msg, fdSock);

	if((NIPC_ERROR_NONE != retval) || (atoi(msg.payload) == HANDSHAKE_FAIL))
	{
		printf("Error en el handshake con el raid.\n");
		return -1;
	}

	free(msg.payload);

	return fdSock;
}

int getSector(int fdSock, nipcMessage *msg)
{
	char 			*tok, bufSector[512];
	int 			sector;

	//TODO preguntarle a los chicos si con int el sector no funciona tambien.-
	tok = strtok(msg->payload, ";");
	tok = strtok(NULL, ";");
	sector = atoi(tok);

 	agregarPedido(sector, READ, P_RAID, bufSector, fdSock);
//	log_info(s_log, "Thread-Raid", "Message info: %s %d", "se realizo un pedido de lectura del sector", sector);

	printf("Llego la peticion de lectura del sector: %d.\n", sector);

	return 0;
}

int putSector(int fdSock, nipcMessage *msg)
{
	char 			*tok, bufSector[512];
	unsigned int 	sector;

	tok = strtok(msg->payload, ";");
	tok = strtok(NULL, ";");
	sector = atoi(tok);

	/* tengo como segundo parámetro lo que tengo que poner en el sector */
	tok = strchr(tok, ',') + 1;
	strncpy(bufSector, tok, 512);

	agregarPedido(sector, WRITE, P_RAID, bufSector, fdSock);
//	log_info(s_log, "Thread-Raid", "Message info: %s %d", "se realizo un pedido de escritura del sector", sector);

	printf("Llego la peticion de escritura del sector: %d.\n", sector);

	return 0;
}
